var utils = require('common/utils');

exports.observer = observer;
exports.defineReactive = defineReactive;

function observer(data, cb) {
  // 取出所有属性遍历
  Object.keys(data).forEach(function (key) {
    // 给每个属性加上get，set
    defineReactive(data, key, data[key], cb);
  });
}
function defineReactive(data, key, val, cb) {
  if (data === undefined || key === undefined || val === undefined) {
    throw new Error('data、key、val 是必传参数');
  }

  if (cb && !utils.isFunction(cb)) {
    throw new Error('cb 参数必须是函数');
  }

  if (typeof data !== 'object') return;

  observer(val); // 监听子属性
  Object.defineProperty(data, key, {
    enumerable: true, // 可遍历
    configurable: false, // 不能修改，删除
    get: function () {
      return val;
    },
    set: function (newVal) {
      val = newVal;
      console.log('已改变 ' + newVal);
      cb && cb(newVal);
    },
  });
}
